package com.study.controller;

import com.study.model.User;
import com.study.service.UserServiceInf;
import org.apache.commons.io.FileUtils;
import org.apache.ibatis.jdbc.Null;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import javax.annotation.Resource;
import java.io.File;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.HashMap;
import java.util.Map;
/*
这里就是后端代码的最前线
后台的框架拿到了前端的请求并解析出了url为/user/getUserById/2
第一就是拿着url在所有的controller中匹配要执行的方法
首先匹配controller，然后匹配方法和路径里的参数
 */

@Controller// 告诉框架，这个类是一个controller（控制层的类），这样框架就把这个类当作controller对待
@ResponseBody// 作用是将controller的方法返回的对象通过适当的转换器转换为指定的格式之后
// 写入到response对象的body区，通常用来返回JSON数据或者是XML数据。
@RequestMapping("/user")// controller的名字，需要在接口文档里指明，这样前端用户知道url怎么写了
public class UserController {//类名
    private static Logger log=LoggerFactory.getLogger(UserController.class);//日志输出，打印日志信息所在类
    @Resource// 指明controller类中需要进行实例化的对象，通过控制反转将实例自动赋值给下面的对象
    //@Autowired
    private UserServiceInf userService;// UserServiceInf是一个接口，框架会自动为他实例化一个实现类的实例

    // /user/{id}
    @RequestMapping(value="/getUserById/{id}",method=RequestMethod.GET)//
    public @ResponseBody User getUserById(@PathVariable String id,Map<String, Object> model){// 将url里的id的值作为实参传入方法
        int userId = Integer.parseInt(id);// 把字符串类型的id转成int型
        User user = this.userService.getUserById(userId);// 调用业务实现层的方法，并得到返回值
        // System.out.println("userId:"+user.name);
        log.info(user.toString());// 将用户名写进日志文件，日志文件是供后人查看的代码执行记录
        return user;
    }

    @RequestMapping(value="/updateUserById",method=RequestMethod.GET)
    public void updateUserById(@RequestParam(value="id") String id,
                               @RequestParam(value="name") String name,
                               @RequestParam(value="password") String password){
        int userId = Integer.parseInt(id);
        this.userService.updateUserById(userId,name,password);
        log.info("updateUserById:"+id);// 将用户名写进日志文件，日志文件是供后人查看的代码执行记录
    }
    @RequestMapping(value="/addUserById",method=RequestMethod.POST)
    public String addUserById(@RequestParam(value="id") String id,
                            @RequestParam(value="name") String name,
                            @RequestParam(value="password") String password,
                            @RequestParam(value="userType") String userType,
                            @RequestParam(value="roleId") String roleId) {
        String judgeResult=this.userService.addUserById(id, name, password, userType, roleId);
        log.info("addUserById:" + id);// 将用户名写进日志文件，日志文件是供后人查看的代码执行记录
        try {
            judgeResult = URLEncoder.encode(judgeResult,"utf-8");
        } catch (UnsupportedEncodingException e) {
        }
        return judgeResult;
    }
    @RequestMapping(value="/getOptionList",method=RequestMethod.GET)
    public @ResponseBody HashMap<Integer, String> getOptionList(@RequestParam("typeId") int typeId){
        HashMap<Integer, String> optionList = this.userService.getOptionList(typeId);
        log.info("getOptionList:typeId="+typeId);
        return optionList;
    }
    //文件上传、
    @RequestMapping(value="/upload")
    public String showUploadPage(){
        return "user_admin/file";
    }

    @RequestMapping(value="/doUpload",method=RequestMethod.POST)
    public String doUploadFile(@RequestParam("file")MultipartFile file) throws IOException{
        if (!file.isEmpty()) {
            log.info("Process file:{}",file.getOriginalFilename());
        }
        FileUtils.copyInputStreamToFile(file.getInputStream(), new File("E:\\",System.currentTimeMillis()+file.getOriginalFilename()));
        return "success";
    }
}